package com.chenjun.designpattern.structural.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * <p>
 * 动态代理模式，要求被代理类和代理类实现相同的接口 java动态代理机制以巧妙的方式实现了代理模式的设计理念。
 * </p>
 * <p>
 * 动态代理模式核心是 java.lang.reflect.InvocationHandler 接口
 * </p>
 * 
 * @author Administrator
 *
 */
public class 动态代理模式
{
	public static void main(String[] args)
	{
		PersonHandler handler = new PersonHandler(new PersonDaoImpl());
		IPersonDao proxy = (IPersonDao) Proxy.newProxyInstance(IPersonDao.class.getClassLoader(), new Class[] { IPersonDao.class },handler);
		proxy.say();
	}
}

/**
 * 抽象接口
 * 
 * @author Administrator
 *
 */
interface IPersonDao
{
	public void say();
}

/**
 * 实现接口的具体类型
 * 
 * @author Administrator
 *
 */
class PersonDaoImpl implements IPersonDao
{
	@Override
	public void say()
	{
		System.out.println("PersonDaoImpl .say() is called ");
	}
}

class PersonHandler implements InvocationHandler
{
	// 被代理的目标对象target
	private Object target;

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
	{
		System.out.println("before");
		Object result = method.invoke(target, args);
		System.out.println("after");
		return result;
	}

	public PersonHandler(Object obj)
	{
		this.target = obj;
	}
}
